package com.huyirong.aicode.core;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.huyirong.aicode.ai.model.HtmlCodeResult;
import com.huyirong.aicode.ai.model.MultiFileCodeResult;
import com.huyirong.aicode.model.enums.CodeGenTypeEnum;

import java.io.File;
import java.nio.charset.StandardCharsets;

public class CodeFileSaver {
    //文件保存根目录
    //final修饰的类，不能被继承,不能被重写，但是可以重载
    private static final String FILE_SAVE_ROOT_DTR = System.getProperty("user.dir") + "tmp/code_output";

    /**保存html代码
     *
     * @param htmlCodeResult
     * @return
     */
    public static File saveHtmlResult(HtmlCodeResult htmlCodeResult) {
        String baseDirPath = buildUniqueDir(CodeGenTypeEnum.HTML.getValue());
        writeToFile(baseDirPath , "index.html" , htmlCodeResult.getHtmlCode());
        return new File(baseDirPath);
    }

    /**保存多文件代码
     *
     * @param result
     * @return
     */
    public static File saveMultiFileCodeResult(MultiFileCodeResult result) {
        String baseDirPath = buildUniqueDir(CodeGenTypeEnum.MULTI_FILE.getValue());
        writeToFile(baseDirPath , "index.html" , result.getHtmlCode());
        writeToFile(baseDirPath , "style.css" , result.getCssCode());
        writeToFile(baseDirPath , "script.js" , result.getJsCode());
        return new File(baseDirPath);
    }

    /**文件路径：tmp/code_output/bizType_雪花ID
     *
     * @param bizType （代码生成类型）
     * @return
     */
    private static String buildUniqueDir(String bizType){
        String uniqueDieName = StrUtil.format("{}_{}",bizType , IdUtil.getSnowflakeNextIdStr());
        String dirPath = FILE_SAVE_ROOT_DTR + File.separator + uniqueDieName;
        //构造路径
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 保存单个文件
     *
     * @param dirPath
     * @param filename
     * @param content
     *
     */
    private static void writeToFile(String dirPath , String filename , String content){
        String filePath = File.separator + filename; //File.separator:表示当前操作系统中文件路径的分隔符
        FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
    }

}
